#!/bin/bash

# 项目打包部署脚本
# 使用Node Docker镜像打包Vue项目，并部署到Nginx

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 无颜色

# 项目配置
PROJECT_PATH=$(pwd)
BUILD_PATH="$PROJECT_PATH/dist"
NGINX_CONF="$PROJECT_PATH/nginx.conf"
IMAGE_NAME="node:20"
NGINX_IMAGE="nginx:1.25"
CONTAINER_NAME="vue-nginx"

# 错误处理函数
handle_error() {
    echo -e "${RED}错误: $1${NC}"
    exit 1
}

# 信息提示函数
log_info() {
    echo -e "${GREEN}[INFO] $1${NC}"
}

# 警告提示函数
log_warn() {
    echo -e "${YELLOW}[WARN] $1${NC}"
}

# 检查命令是否存在
check_command() {
    command -v $1 >/dev/null 2>&1 || handle_error "$1 未安装，请先安装 $1"
}

# 检查Docker是否安装
check_command docker

# 检查项目目录是否存在
if [ ! -d "$PROJECT_PATH" ]; then
    handle_error "项目目录不存在: $PROJECT_PATH"
fi

# 检查是否为Vue项目
if [ ! -f "$PROJECT_PATH/package.json" ] || [ ! -f "$PROJECT_PATH/vite.config.js" ] && [ ! -f "$PROJECT_PATH/webpack.config.js" ]; then
    handle_error "当前目录不是Vue项目根目录，缺少package.json或配置文件"
fi

# 检查Nginx配置文件
if [ ! -f "$NGINX_CONF" ]; then
    log_warn "未找到Nginx配置文件，将使用默认配置"
    cat > "$NGINX_CONF" << EOF
server {
    listen 80;
    server_name localhost;
    
    root /usr/share/nginx/html;
    index index.html index.htm;
    
    location / {
        try_files \$uri \$uri/ /index.html;
    }
}
EOF
fi

# 清理旧的构建文件
log_info "清理旧的构建文件..."
rm -rf "$BUILD_PATH"

# 使用Docker构建Vue项目
log_info "开始使用Docker构建Vue项目..."
docker run --rm -v "$PROJECT_PATH":/app -w /app $IMAGE_NAME bash -c "yarn run build:prod"

if [ ! -d "$BUILD_PATH" ]; then
    handle_error "构建失败，未生成dist目录"
fi

log_info "Vue项目构建成功！"

# 停止并删除旧的Nginx容器
log_info "停止并删除旧的Nginx容器..."
docker stop $CONTAINER_NAME >/dev/null 2>&1
docker rm $CONTAINER_NAME >/dev/null 2>&1

# 启动Nginx容器
log_info "启动Nginx容器..."
docker run -d \
    --name $CONTAINER_NAME \
    -p 8080:80 \
    -v "$BUILD_PATH":/usr/share/nginx/html:ro \
    -v "$NGINX_CONF":/etc/nginx/conf.d/default.conf:ro \
    $NGINX_IMAGE

if [ $? -ne 0 ]; then
    handle_error "启动Nginx容器失败"
fi

log_info "Nginx容器启动成功！"
log_info "Vue应用已部署到 http://localhost"

# 显示容器状态
docker ps -f name=$CONTAINER_NAME